#ifndef __BSP_PID_ASSISTANT__
#define __BSP_PID_ASSISTANT__

#include "main.h"
#include "bsp_pid.h"


/* C语言共用体，用于数据间的转换 */
typedef union
{
  unsigned char ch[4];
  float f;
}_cf_temp;

typedef union
{
  unsigned char ch[4];
  unsigned int ui;
}_cui_temp;

typedef union
{
  unsigned char ch[4];
  int i;
}_ci_temp;




/* 发送三个目标值 */
typedef struct
{
  _cui_temp DATA_Head;     //数据包头，占4字节。
  uint8_t DATA_Channel;   //PID曲线通道。
  _cui_temp DATA_Length;   //数据包长度（字节数）,占4字节。
  uint8_t DATA_Command;   //指令类型。
  _cf_temp PID_P;      //PID比例系数。
  _cf_temp PID_I;      //PID积分系数。
  _cf_temp PID_D;      //PID微分系数。
  uint8_t DATA_Check_Bit;     //数据包校验位（数据尾）。
}DATA_PID_RTx;

/* 发送一个目标值 */
typedef struct
{
  _cui_temp DATA_Head;     //数据包头，占4字节。
  uint8_t DATA_Channel;   //PID曲线通道。
  _cui_temp DATA_Length;   //数据包长度（字节数）,占4字节。
  uint8_t DATA_Command;   //指令类型。
  _ci_temp DATA_Value;     //数据目标值。
  uint8_t DATA_Check_Bit;     //数据包校验位（数据尾）。
}DATA_TARGET_RTx;


/* 只发送指令 */
typedef struct
{
  _cui_temp DATA_Head;     //数据包头，占4字节。
  uint8_t DATA_Channel;   //PID曲线通道。
  _cui_temp DATA_Length;   //数据包长度（字节数）,占4字节。
  uint8_t DATA_Command;   //指令类型。
  uint8_t DATA_Check_Bit;     //数据包校验位（数据尾）。
}DATA_CMD_RTx;






#define FRAME_HEADER      0x59485A53    // 帧头。
#define DATA_PID_DATA_Length        0x17    //发送PID系数的数据包的长度。
#define DATA_TARGET_DATA_Length       0x0f  //发送目标值的数据包的长度。
#define DATA_CMD_DATA_Length      0x0b    //发送指令的数据包的长度。



/* 通道宏定义 */
#define CURVES_CH1      0x01
#define CURVES_CH2      0x02
#define CURVES_CH3      0x03
#define CURVES_CH4      0x04
#define CURVES_CH5      0x05

/* 指令(下位机 -> 上位机) */
#define SEND_TARGET_CMD      0x01     // 发送上位机通道的目标值
#define SEND_FACT_CMD        0x02     // 发送通道实际值
#define SEND_P_I_D_CMD       0x03     // 发送 PID 值（同步上位机显示的值）
#define SEND_START_CMD       0x04     // 发送启动指令（同步上位机按钮状态）
#define SEND_STOP_CMD        0x05     // 发送停止指令（同步上位机按钮状态）
#define SEND_PERIOD_CMD      0x06     // 发送周期（同步上位机显示的值）

/* 指令(上位机 -> 下位机) */
#define SET_P_I_D_CMD        0x10     // 设置 PID 值
#define SET_TARGET_FLOAT_CMD       0x11     // 设置目标值
#define START_CMD            0x12     // 启动指令
#define STOP_CMD             0x13     // 停止指令
#define RESET_CMD            0x14     // 复位指令
#define SET_PERIOD_CMD       0x15     // 设置周期
//用户添加
#define SET_TARGET_Kalman_Q     0x16
#define SET_TARGET_Kalman_R     0x17
#define SET_TARGET_INT_CMD       0x18     // 设置目标值


/* 空指令 */
#define CMD_NONE             0xFF     // 空指令








void PID_Assistant_Init(void);
void UPLOAD_DATA_TO_PID_Assistant(_PID_Typedef *PID_Struct);
void UPLOAD_DATA_TO_TARGET_Assistant(_PID_Typedef *PID_Struct,uint8_t Cmd,int value);
void UPLOAD_DATA_TO_CMD_Assistant(uint8_t Cmd);
void Receive_Data_Process(void);
void USARTx_R_T_C_Handler_Part(UART_HandleTypeDef *huart, DMA_HandleTypeDef *hdma_usart_rx);



#endif
